﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Linq;
using System.Linq;

namespace TTApp.Phone.Silverlight.Hexagons
{
    /// <summary>
    /// Một số phương thức hỗ trợ đọc file XML.
    /// </summary>
    public static class XmlUtils
    {
        /// <summary>
        /// Lấy element với tên được truyền vào. Sẽ throw Exception nếu nhiều hơn 2 element được tìm thấy.
        /// </summary>
        /// <param name="parentElement">Element dùng để tìm element con.</param>
        /// <param name="descendantName">Tên của element con.</param>
        /// <returns></returns>
        public static XElement GetUniqueChildElement(XElement parentElement, string descendantName)
        {
            XElement element = null;

            try
            {
                element = (
                    from descendants
                    in parentElement.Elements(descendantName)
                    select descendants
                ).SingleOrDefault();
            }
            catch (InvalidOperationException)
            {
                throw new InvalidOperationException(String.Format("Element {0} được set nhiều hơn 1 lần.", descendantName));
            }

            return element;
        }

        /// <summary>
        /// Lấy tên của element nằm trong parentElement. Sẽ throw Exception nếu parentElement có khác 1 element
        /// được tìm thấy.
        /// </summary>
        public static string GetSingleChildName(XElement parentElement)
        {
            string name = "";
            try
            {
                var descendant = (
                    from descendants
                    in parentElement.Elements()
                    select descendants).Single();

                name = descendant.Name.LocalName;
            }
            catch (InvalidOperationException ioe)
            {
                throw new InvalidOperationException("Không có descendant nào được set hoặc có nhiều hơn 1 descendant được set.");
            }

            return name;
        }
    }
}
